package org.zuel.util;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;
@Component
public class JwtUtil {

    // 常量
    public static final long EXPIRE = 1000 * 60 * 60 * 24 * 7; // Token过期时间（7天）
    public static final String SECRET = "yourSecretKey"; // 密钥，建议使用更复杂的密钥

    /**
     * 生成JWT Token
     * @param userName 用户姓名
     * @return JWT Token字符串
     */
    public static String generateToken(String userName) {
        return Jwts.builder()
                .setHeaderParam("typ", "JWT")
                .setHeaderParam("alg", "HS256")
                .setSubject("user-token")
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
                .claim("userName", userName)  // 存储用户姓名
                .signWith(SignatureAlgorithm.HS256, SECRET)
                .compact();
    }

    /**
     * 验证JWT Token是否有效
     * @param token JWT Token字符串
     * @return 是否有效
     */
    public static boolean validateToken(String token) {
        if (StringUtils.isEmpty(token)) {
            return false;
        }
        try {
            Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 从JWT Token中获取用户姓名
     * @param token JWT Token字符串
     * @return 用户姓名
     */
    public static String getUserNameFromToken(String token) {
        if (StringUtils.isEmpty(token)) {
            return null;
        }
        try {
            Jws<Claims> claimsJws = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token);
            Claims claims = claimsJws.getBody();
            return claims.get("userName", String.class);
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 从请求头中获取JWT Token并验证
     * @param request HTTP请求
     * @return 是否有效
     */
    public static boolean validateTokenFromRequest(HttpServletRequest request) {
        String token = request.getHeader("Authorization");
        if (StringUtils.isEmpty(token) || !token.startsWith("Bearer ")) {
            return false;
        }
        token = token.substring(7); // 去掉"Bearer "前缀
        return validateToken(token);
    }

    /**
     * 从请求头中获取JWT Token并提取用户姓名
     * @param request HTTP请求
     * @return 用户姓名
     */
    public static String getUserNameFromRequest(HttpServletRequest request) {
        String token = request.getHeader("Authorization");
        if (StringUtils.isEmpty(token) || !token.startsWith("Bearer ")) {
            return null;
        }
        token = token.substring(7); // 去掉"Bearer "前缀
        return getUserNameFromToken(token);
    }

}